package com.michale.framework.security.service;

import com.michale.common.domain.security.LoginUserDetail;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author Michale
 * @apiNote Token服务类
 */
@Api(tags = " Token服务")
public interface TokenService {

    /**
     * 从数据生成令牌
     *
     * @param claims 数据
     * @return token
     */
    String createToken(Map<String, Object> claims);

    /**
     * 从令牌中获取数据
     *
     * @param token 令牌
     * @return 数据声明
     */
    Claims parseToken(String token);

    /**
     * 从令牌中获取用户名
     *
     * @param token 令牌
     * @return 用户名
     */
    String getUsernameFromToken(String token);

    /**
     * 从请求中获取用户身份信息
     *
     * @return 用户信息
     */
    LoginUserDetail getLoginUser(HttpServletRequest request);

    /**
     * 验证令牌有效期，相差不足20分钟，自动刷新缓存
     *
     * @param loginUserDetail 登录用户信息
     */
    void verifyToken(LoginUserDetail loginUserDetail);

    /**
     * 刷新令牌有效期
     *
     * @param loginUserDetail 用户信息
     */
    void refreshToken(LoginUserDetail loginUserDetail);


    /**
     * 创建令牌
     *
     * @param loginUserDetail 用户信息
     * @return 令牌
     */
    String createToken(LoginUserDetail loginUserDetail);

    /**
     * 设置用户身份信息
     */
    void setLoginUser(LoginUserDetail loginUserDetail);

    /**
     * 删除用户身份信息
     */
    void deleteLoginUser(String token);

    /**
     * 设置用户代理信息
     *
     * @param loginUserDetail 登录信息
     */
    void setUserAgent(LoginUserDetail loginUserDetail);

    /**
     * 从请求中获取token
     *
     * @param request 请求域
     * @return token
     */
     String getToken(HttpServletRequest request);

    /**
     * 获取缓存的token键值
     *
     * @param uuid 唯一标识
     * @return 缓存的token键值
     */
    String getTokenKey(String uuid);
}
